package com.tmt.im.jpa.systemparam;

import com.alibaba.fastjson2.JSONObject;
import com.tmt.im.jpa.entity.SystemParam;
import com.tmt.im.jpa.repository.SystemParamRepo;
import com.tmt.springboot.common.helper.IdSnowFlake;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.io.Serial;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * 系统参数表
 *
 * @Description TODO
 * @Author wuyi
 * @Date 2024/9/20 16:00
 * @Version 1.0
 **/

public class SystemParamInitiator implements Serializable {
    @Serial
    private static final long serialVersionUID = 8728677627998138463L;

    public static void initial(IGetSystemParamInfos iGetSystemParamInfos, SystemParamRepo systemParamRepo) {
        LinkedHashMap<String, SystemParamInfo> map = iGetSystemParamInfos.getParams();
        if (CollectionUtils.isEmpty(map)) {
            return;
        }

        List<SystemParam> paramList = new ArrayList<>();
        for (String key : map.keySet()) {
            SystemParamInfo info = map.get(key);
            info.setCode(key);

            SystemParam param = systemParamRepo.findOneByParamCode(key);
            if (param == null) {
                param = new SystemParam();
                param.setId(IdSnowFlake.getId());
                param.setParamCode(info.getCode());
                param.setVersion(0L);
                param.setCreateTime(new Timestamp(System.currentTimeMillis()));
            } else if (key.endsWith("_version")) {
                //如果是版本参数，则需要比较版本大小，如果版本小于数据表中的版本，则直接跳过。
                if (!StringUtils.hasText(info.getValue()) || info.getValue().compareTo(param.getParamValue()) < 0) {
                    continue;
                }
            } else {
                //如果参数已经存在，则直接跳过。
                continue;
            }
            paramList.add(param);

            param.setName(info.getName());
            param.setParamValue(info.getValue());
            param.setDescr(info.getDescr());
            if (!StringUtils.hasText(param.getDescr())) {
                param.setDescr(info.getName());
            }
            if (info.getExtend() != null) {
                param.setParamExtend(JSONObject.from(info.getExtend()).toJSONString());
            }
            param.setUpdateTime(new Timestamp(System.currentTimeMillis()));
        }

        systemParamRepo.saveAll(paramList);
    }

}
